/**************************************************************************************************
 * red library                                                                                    *
 * Copyright © 2012 David Kretzmer                                                                *
 *                                                                                                *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software  *
 * and associated documentation files (the "Software"), to deal in the Software without           *
 * restriction,including without limitation the rights to use, copy, modify, merge, publish,      *
 * distribute,sublicense, and/or sell copies of the Software, and to permit persons to whom the   *
 * Software is furnished to do so, subject to the following conditions:                           *
 *                                                                                                *
 * The above copyright notice and this permission notice shall be included in all copies or       *
 * substantial portions of the Software.                                                          *
 *                                                                                                *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING  *
 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND     *
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   *
 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, *
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.        *
 *                                                                                                *
 *************************************************************************************************/

#pragma once

#include "red/red.hpp"
#include "light/utility/type_traits.hpp"


namespace red
{
	//=============================================================================================
	// Arithmetic operators
	//=============================================================================================
	// +
	template
	<
		typename MatrixA, typename MatrixB,
		typename light::enable_if<is_matrix<MatrixA>::value, int>::type = 0,
		typename light::enable_if<is_matrix<MatrixB>::value, int>::type = 0
	>
	typename result_type<MatrixA, MatrixB>::type operator + (MatrixA const &a, MatrixB const &b)
	{
		assert(RED_COLUMNS(a) == RED_COLUMNS(b) && RED_ROWS(a) == RED_ROWS(b));

		typedef typename result_type<MatrixA, MatrixB>::type res_type;
		res_type result;
		result.resize(RED_COLUMNS(a) * RED_ROWS(a));

		for(size_t column = 0; column < RED_COLUMNS(a); ++column)
			result[column] = a[column] + b[column];

		return result;
	}


	// -
	template
	<
		typename MatrixA, typename MatrixB,
		typename light::enable_if<is_matrix<MatrixA>::value, int>::type = 0,
		typename light::enable_if<is_matrix<MatrixB>::value, int>::type = 0
	>
	typename result_type<MatrixA, MatrixB>::type operator - (MatrixA const &a, MatrixB const &b)
	{
		assert(RED_COLUMNS(a) == RED_COLUMNS(b) && RED_ROWS(a) == RED_ROWS(b));

		typedef typename result_type<MatrixA, MatrixB>::type res_type;
		res_type result;
		result.resize(RED_COLUMNS(a) * RED_ROWS(a));

		for(size_t column = 0; column < RED_COLUMNS(a); ++column)
			result[column] = a[column] - b[column];

		return result;
	}

} // namespace: red
